iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0

接下來撰寫使宅配機器人移動的策略

上篇提到 robot 需要 return 名為 action 的 object
而 robot 就是代表機器人移動的策略

action = {direction:... , memory:...}

讓機器人移動並執行的目標如下

  1. 拜訪『包裹所在的指定地點』並收取包裹
  2. 收完包裹後再前往『目標地點』遞送包裹

隨機移動的策略

先嘗試使機器人隨機轉彎並收取包裹的策略

/*
隨機選出roadGraph[state.place]可抵達的地點去拜訪
並回傳隨機選出的地點
*/ 
function randomPick(array){
    let choice = Math.floor(Math.random() * array.length);
    return array[choice];
}

/*
傳入 state (state包含當下的位置)
回傳要前往的地點(從當下的位置可到達的地點中隨機選一個拜訪)
*/
function randomRobot(state){
    return {direction: randomPick(roadGraph[state.place])}
}

稍微回復一下記憶,roadGraph 長這樣
roadGraph[state.place] 實際上可能代表的就是 roadGraph[Daria's House]
也就是 ["Ernie's House", 'Town Hall'] 這個陣列

{
Alice's House: ["Bob's House", 'Cabin', 'Post Office'],
Bob's House: ["Alice's House", 'Town Hall'],
Cabin: ["Alice's House"],
Daria's House:  ["Ernie's House", 'Town Hall'],
Ernie's House:  ["Daria's House", "Grete's House"],
Farm: ["Grete's House", 'Marketplace'],
Grete's House: ["Ernie's House", 'Farm', 'Shop'],
Marketplace: ['Farm', 'Post Office', 'Shop', 'Town Hall'],
Post Office: ["Alice's House", 'Marketplace'],
Shop: ["Grete's House", 'Marketplace', 'Town Hall'],
Town Hall: ["Bob's House", "Daria's House", 'Marketplace', 'Shop'],
}

為 VillageState class 新增 static method 以建立隨機的 state

static nameOfMethod(){ ... }

class VillageState{
    constructor(place,parcels){
        ...
    }
    move(destination){
        ...
    }
    /*
    generate a random state
    give it a default length of parcels
    */
    static random(parcelCount = 5){
        let parcels =[];
        for(let i=0;i < parcelCount;i++){
            let address = randomPick(Object.keys(roadGraph));
            let place;
            // if place === address(destination) then pick destination again
            do{
                place = randomPick(Object.keys(roadGraph));
            }while(palce === address);
            parcels.push({place, address});
        }
        return new VillageState("Post Office" , parcels);
    }
}

啟動一個虛擬世界並用『隨機行走的策略』執行遞送

其實 runRobot 接收3個parameter
state(整個虛擬世界的狀態), robot(行走的策略),memory(記憶值)
但因為隨機行走沒有記憶資料,所以這裡沒有傳入/忽略傳入(omit parameter)

runRobot(VillageState.random() , randomRobot);
// Move to Alice's House
// Move to Post Office
// ...
// Move to Ernie's House
// Done in 81 turns

這時候可以在console中看到行走的地點及完成所有遞送經過了多少次數


上一篇
Chapter 7 實作專案-3-待更新-day24
下一篇
Chapter 7 實作專案-5(改良移動策略)-day26
系列文
溫故而知新:Eloquent Javascript 閱讀筆記26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言